"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 5、常用标记用例参数.py
"""

"""

标记测试用例：
    场景：只执行符合要求的某一部分用例，可以把一个 web 项目划分多个模块，然后指定模块名称执行
    解决： 在测试用例方法上加 @pytest.mark.标签名
    执行：-m 执行自定义标记的相关用例
    例如：pytest -s test_mark_zi_09.py -m webtest( -m=webtest 或 -m "not apptest")
    

pytest 常用参数：
    --help （pytest --help） 获取 pytest 所有的参数列表 
    -v  打印详细日志(用例成功与否)
    -s  打印输出日志（一般vs一块使用）
    -m  标记用例
    -collect-only （只收集，不运行） 测试平台 pytest 自动导入功能
    
    -x  用例一旦失败（遇到 fail/error），就立刻停止执行   
            例如 ： 冒烟测试 : 每日构建最基本的功能   --maxfail=num  允许最大失败个数
    -k  执行包含某个关键字的测试用例（不需要标记，针对测试用例名称：方法名称）
            例如 ：  
               pytest -v 5、常用标记用例参数.py -k "需要执行用例的关键字"
               pytest -v 5、常用标记用例参数.py -k “smoke”
               或者逻辑运算符not : pytest -v 5、常用标记用例参数.py -k   "not 不需要执行用例的关键字"
    
    --lf(--last-failed)    只重新运行上一次失败的用例（只重新运行故障）    
            命令 ： pytest --lf -vs
    --ff(--failed-first)   先运行失败的用例，再执行其他的测试用例（先运行故障，再运行其余的测试）
            命令 ： pytest --ff -vs : 类似于先回归上轮bug，在回归其余用例
"""

"""
Mark 标记测试用例
    场景 ： 只执行符合要求的某一部分用例，可以把一个 web 项目划分为多个模块，然后指定模块名称执行
    解决 ： 在测试用例方法上加 @pytest.mark.标签名
    执行 ： -m 执行自定义标记的相关用例
        pytest -s 5、常用标记用例参数.py  -m=smoke
        pytest -s 5、常用标记用例参数.py  -m smoke
        pytest -s 5、常用标记用例参数.py  -m "not smoke"       
"""

# 一：新建标签  和用例所在的目录同一层，新建pytest.ini文件。  首行是[pytest]
"""
[pytest]
markers = smoke
          regression
          Webauto
          Apiauto
          Appauto

"""

import pytest


# 二：在测试用例方法加上装饰器 @pytest.mark.标签名
@pytest.mark.smoke
def test_demo1():
    assert 1 == 1


"""
跳过（Skip）及预期失败（xFail）
这是pytest的内置标签，可以处理一些特殊的测试用例，不能成功的测试用例   pytest.mark.skip(reason)
    skip    始终跳过该测试用例 (用例已完成，开发代码未完成。也有可能是用例没完成)
    skipif  遇到特殊的情况跳过该用例 （满足条件后，才会执行该用例）
    xfail   遇到特定情况，产生一个“期望失败”输出 （开发已经修改完bug，不确定本轮该用例是否执行通过）
"""


# skip   始终跳过该测试用例
# 使用装饰器
@pytest.mark.skip
def test_demo22():
    print('start')
    assert True


@pytest.mark.skip(reason='上轮的问题还没改完，先不执行此用例')
def test_demo2():
    print('上轮的问题还没改完')
    assert True


# ==================================

def cherk_logon():
    return False


# 条件判断是否跳过
def test_funcyion():
    print('start')
    # 如果未登录，则跳过该用例
    if not cherk_logon():
        pytest.skip('没有登录就不执行')
    print('end')


# skipif  遇到特殊的情况跳过该用例
import sys

# 打印操作系统： win32
print(sys.platform)


@pytest.mark.skipif(sys.platform == 'win32', reason='win系统不执行')
def test_demo():
    assert 1 == 1


"""
xfail  遇到特定情况，产生一个“期望失败”输出
开发刚改完bug，用例一定会执行。成功返回 xpassed，失败返回 xfailed
"""


# 运行结果：XPASS (bug 号是 7939) / XFAIL (bug 号是 7939)
@pytest.mark.xfail(reason='bug 号是 7939')
def test_demo3():
    assert 1 == 1


def test_xfail():
    print("**** 开始测试 *******")
    pytest.xfail(reason="该功能尚未完成")
    print("测试过程")
    assert 1 == 1
